package br.com.esrestaurante.faces;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.esrestaurante.dao.AberturaDAO;
import br.com.esrestaurante.dao.ContaDAO;
import br.com.esrestaurante.dao.MesaDAO;
import br.com.esrestaurante.dao.PedidoDAO;
import br.com.esrestaurante.entidades.Abertura;
import br.com.esrestaurante.entidades.Conta;
import br.com.esrestaurante.entidades.Mesa;
import br.com.esrestaurante.entidades.MesaVO;
import br.com.esrestaurante.entidades.Pedido;
import br.com.esrestaurante.entidades.Usuario;
import br.com.esrestaurante.tipos.TipoPerfilUsuario;

public class GerenciarContaFaces extends Faces implements Serializable{

	private static final long serialVersionUID = 1L;

	private final String titulo = "Gerenciar Conta";
	
	private Usuario usuarioWB;
	
	private List<MesaVO> listaMesasOcupadasComConta;

	private Mesa mesaSelecionada;
	
	private Usuario clienteSelecionado;	
	
	private Conta contaSelecionada;
	
	private Calendar HoraAbertura;
	
	private String numeroMesa;	
	
	private String responsavel;
	
	private float totalConta;
	
	private boolean exibeVoltar;
	
	
	private List<Pedido> listaPedidoMesa;
	
	private boolean exibeMsgPedidosAbertos;
		
	public GerenciarContaFaces() throws IOException {

		usuarioWB = getUsuarioLogado();
		
		if(TipoPerfilUsuario.CLIENTE.equals(usuarioWB.getPerfil())) {
			exibeVoltar = false;
			clienteSelecionado = usuarioWB;
			Abertura abertura = new AberturaDAO().recuperarUltimaAberturasClietne(clienteSelecionado);
			mesaSelecionada = abertura.getMesa();
			popularCampos(abertura);
			
		}else {
			exibeVoltar = true;
			List<Mesa> listaMesasOcupada = new MesaDAO().listarMesasOcupadas();
			listaMesasOcupadasComConta = new ArrayList<MesaVO>();
			
			for (Mesa mesa : listaMesasOcupada) {
				Abertura abertura = new AberturaDAO().recuperarUltimaAberturasMesa(mesa);
				Conta conta = new ContaDAO().recuperarContaPorAbertura(abertura);
				if(conta != null &&  conta.getDataEncerramento() == null) {
					
					MesaVO mesaVO = new MesaVO(mesa);
					listaMesasOcupadasComConta.add(mesaVO);
				}
			}
		}
		
		
	}
	
	private void popularCampos(Abertura abertura) {
		
 		
		
		responsavel = abertura.getGarcom().getNome();
		clienteSelecionado = abertura.getCliente();
		numeroMesa = mesaSelecionada.getNumero().toString();
		HoraAbertura = abertura.getDataAbertura();
		
		
		contaSelecionada = new ContaDAO().recuperarContaPorAbertura(abertura);
		
		listaPedidoMesa = new PedidoDAO().recuperarPedidosPorConta(contaSelecionada);
		
		totalConta = 0f;
		for (Pedido pedido : listaPedidoMesa) {
			
			if (pedido.getDataEntrega() == null) {				
				exibeMsgPedidosAbertos = true;
			} else {
				totalConta+=pedido.getValorTotal();
			}
		}
	}

	public void  selecionarMesaAction() {		
		Abertura abertura = new AberturaDAO().recuperarUltimaAberturasMesa(mesaSelecionada);
		popularCampos(abertura);

	}
	
	public String  selecionarClienteAction() {
		return "";
	}
		
	
	public String voltarAction() {
		
		if (TipoPerfilUsuario.CLIENTE.equals(usuarioWB.getPerfil())){
			return getStringRetorno();
		}		
		
		if(mesaSelecionada != null) {
			mesaSelecionada = null;
			return null;
			
		}
		return getStringRetorno();
	}	
	
	public String cancelarAction() {
		
		return getStringRetorno();
	}
	
	public String fecharContaAction() {
		
		contaSelecionada.setDataEncerramento(Calendar.getInstance());
		
		contaSelecionada.setValorTotal(totalConta);
		
		new ContaDAO().merge(contaSelecionada);
		
		
		return getStringRetorno();
	}
		
	public Usuario getClienteSelecionado() {
		return clienteSelecionado;
	}

	public void setClienteSelecionado(Usuario clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}

	public Mesa getMesaSelecionada() {
		return mesaSelecionada;
	}

	public void setMesaSelecionada(Mesa mesaSelecionada) {
		this.mesaSelecionada = mesaSelecionada;
	}

	public String getTitulo() {
		return titulo;
	}

	
	
	public List<MesaVO> getListaMesasOcupadasComConta() {
		return listaMesasOcupadasComConta;
	}

	public void setListaMesasOcupadasComConta(
			List<MesaVO> listaMesasOcupadasComConta) {
		this.listaMesasOcupadasComConta = listaMesasOcupadasComConta;
	}

	public Calendar getHoraAbertura() {
		return HoraAbertura;
	}

	public void setHoraAbertura(Calendar horaAbertura) {
		HoraAbertura = horaAbertura;
	}

	public String getNumeroMesa() {
		return numeroMesa;
	}

	public void setNumeroMesa(String numeroMesa) {
		this.numeroMesa = numeroMesa;
	}

	public String getResponsavel() {
		return responsavel;
	}

	public void setResponsavel(String responsavel) {
		this.responsavel = responsavel;
	}

	public float getTotalConta() {
		return totalConta;
	}

	public void setTotalConta(float totalConta) {
		this.totalConta = totalConta;
	}

	public List<Pedido> getListaPedidoMesa() {
		return listaPedidoMesa;
	}

	public void setListaPedidoMesa(List<Pedido> listaPedidoMesa) {
		this.listaPedidoMesa = listaPedidoMesa;
	}

	public boolean isExibeMsgPedidosAbertos() {
		return exibeMsgPedidosAbertos;
	}

	public void setExibeMsgPedidosAbertos(boolean exibeMsgPedidosAbertos) {
		this.exibeMsgPedidosAbertos = exibeMsgPedidosAbertos;
	}

	public Conta getContaSelecionada() {
		return contaSelecionada;
	}

	public void setContaSelecionada(Conta contaSelecionada) {
		this.contaSelecionada = contaSelecionada;
	}

	public boolean isExibeVoltar() {
		return exibeVoltar;
	}

	public void setExibeVoltar(boolean exibeVoltar) {
		this.exibeVoltar = exibeVoltar;
	}
	
}
